"use strict";
// useVirtualList.ts
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = useVirtualList;
var vue3_5_13_1 = require("./vue/vue3.5.13");
function useVirtualList(config) {
    // 获取元素
    var actualHeightContainerEl = null, translateContainerEl = null, scrollContainerEl = null;
    (0, vue3_5_13_1.onMounted)(function () {
        actualHeightContainerEl = document.querySelector(config.actualHeightContainer);
        scrollContainerEl = document.querySelector(config.scrollContainer);
        translateContainerEl = document.querySelector(config.translateContainer);
    });
    // 数据源，便于后续直接访问
    var dataSource = [];
    // 数据源发生变动
    (0, vue3_5_13_1.watch)(function () { return config.data.value; }, function (newVla) {
        // 更新数据源
        dataSource = newVla;
        // 计算需要渲染的数据
        updateRenderData(0);
    });
    // 更新实际高度
    var updateActualHeight = function () {
        var actualHeight = 0;
        dataSource.forEach(function (_, i) {
            actualHeight += getItemHeightFromCache(i);
        });
        actualHeightContainerEl.style.height = actualHeight + "px";
    };
    // 缓存已渲染元素的高度
    var RenderedItemsCache = {};
    // 更新已渲染列表项的缓存高度
    var updateRenderedItemCache = function (index) {
        // 当所有元素的实际高度更新完毕，就不需要重新计算高度
        var shouldUpdate = Object.keys(RenderedItemsCache).length < dataSource.length;
        if (!shouldUpdate)
            return;
        (0, vue3_5_13_1.nextTick)(function () {
            // 获取所有列表项元素
            var Items = Array.from(document.querySelectorAll(config.itmeContainer));
            // 进行缓存
            Items.forEach(function (el) {
                if (!RenderedItemsCache[index]) {
                    RenderedItemsCache[index] = el.offsetHeight;
                }
                index++;
            });
            // 更新实际高度
            updateActualHeight();
        });
    };
    // 获取缓存高度，无缓存，取配置项的 itemHeight
    var getItemHeightFromCache = function (index) {
        var val = RenderedItemsCache[index];
        return val === void 0 ? config.itemHeight : val;
    };
    // 实际渲染的数据
    var actualRenderData = (0, vue3_5_13_1.ref)([]);
    // 更新实际渲染数据
    var updateRenderData = function (scrollTop) {
        var startIndex = 0;
        var offsetHeight = 0;
        for (var i = 0; i < dataSource.length; i++) {
            offsetHeight += getItemHeightFromCache(i);
            if (offsetHeight >= scrollTop) {
                startIndex = i;
                break;
            }
        }
        // 计算得出的渲染数据
        actualRenderData.value = dataSource.slice(startIndex, startIndex + config.size);
        // 缓存最新的列表项高度
        updateRenderedItemCache(startIndex);
        // 更新偏移值
        updateOffset(offsetHeight - getItemHeightFromCache(startIndex));
    };
    // 更新偏移值
    var updateOffset = function (offset) {
        translateContainerEl.style.transform = "translateY(".concat(offset, "px)");
    };
    // 滚动事件
    var handleScroll = function (e) {
        // 渲染正确的数据
        updateRenderData(e.target.scrollTop);
    };
    // 注册滚动事件
    (0, vue3_5_13_1.onMounted)(function () {
        scrollContainerEl === null || scrollContainerEl === void 0 ? void 0 : scrollContainerEl.addEventListener("scroll", handleScroll);
    });
    // 移除滚动事件
    (0, vue3_5_13_1.onBeforeUnmount)(function () {
        scrollContainerEl === null || scrollContainerEl === void 0 ? void 0 : scrollContainerEl.removeEventListener("scroll", handleScroll);
    });
    return { actualRenderData: actualRenderData };
}
